/**
 * 	Fichier contenant les différentes définitions des structures et données de l'arbre.
 *
 *	@file 		arbre.h
 *	@author 	Jacquemin Thibault Marleix Mathieu
 *	@version 	0.5
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
#include <string.h>

int DEBUG;		/*!< Option permettant l'affichage des traces de debugging */

#define ARBRE	/*!< Option d'inclusion du header*/

/*!
 *  @brief Types de noeuds.
 */
#define NODEEMPTY 0	 	/*!< Noeud vide @hideinitializer */
#define NODEFLOAT 1		/*!< Noeud de type float @hideinitializer */
#define NODEOP 2	 	/*!< Noeud de type opérateur @hideinitializer */
#define NODESTRING 3	/*!< Noeud de type string @hideinitializer */
#define NODECOM 4		/*!< Noeud de type commentaire @hideinitializer */

/*!
 *  @brief Types d'opérateurs.
 */
#define OPDRAW 0		/*!< Opérateur de type function draw @hideinitializer */
#define OPASSIGN 1		/*!< Opérateur de type function assignation @hideinitializer */
#define OPEQ 2			/*!< Opérateur de type comparateur ==  @hideinitializer */
#define OPLEQ 3			/*!< Opérateur de type comparateur =< @hideinitializer */
#define OPMINUS 4		/*!< Opérateur de type opérateur - @hideinitializer */
#define OPPLUS 5		/*!< Opérateur de type opérateur + @hideinitializer */
#define OPGT 6			/*!< Opérateur de type comparateur > @hideinitializer */
#define OPLT 7			/*!< Opérateur de type comparateur < @hideinitializer */
#define OPNEQ 8			/*!< Opérateur de type comparateur != @hideinitializer */
#define OPGEQ 9			/*!< Opérateur de type comparateur >= @hideinitializer */
#define OPMUL 10		/*!< Opérateur de type opérateur * @hideinitializer */
#define OPDIV 11		/*!< Opérateur de type opérateur / @hideinitializer */
#define OPLOOP 12		/*!< Opérateur de type boucle for @hideinitializer */
#define OPIF 13			/*!< Opérateur de type test conditional if @hideinitializer */
#define OPELSE 14		/*!< Opérateur de type conditional else @hideinitializer */
#define OPFUNC 15		/*!< Opérateur de type appel de fonction @hideinitializer */
#define OPDEF 16		/*!< Opérateur de type défintion de fonction @hideinitializer */

/**
 * 	\struct tree
 * 	\brief Pointeur sur noeud
 *
 * 	Structure pointant sur différents noeuds fils.
 */
typedef struct node * tree;

/**
 * 	\struct operateur
 * 	\brief Noeud opérateur
 *
 * 	Structure contenant le type du noeud opérateur, ses fils et leur nombre.
 */
typedef struct operateur
{
	int type;	/*!< Entier défini plus haut, précise le type de l'opérateur. */
	int nbSons;	/*!< Entier indiquant le nombre de fils de l'opérateur. */
	tree* sons; /*!< Liste de noeud pointant sur les fils de l'opérateur */
} operateur;

/**
 * 	\union contentNode
 * 	\brief Contenu d'un noeud
 *
 * 	Union contenant la données des feuilles ou le lien vers une structure opérateur pour un noeud de type opérateur.
 */
typedef union contentNode
{
	float f;		/*!< Nombre flottant indiquant la valeur d'une feuille de type NODEFLOAT. */
	char * c;		/*!< Chaîne de charactère indiquant la valeur d'une feuille de type NODESTRING. */
	operateur op;	/*!< Structure opérateur pointant vers le contenu d'un noeud de type NODEOP. */
} contentNode;

/**
 * 	\struct node
 * 	\brief Structure d'un noeud
 *
 * 	Structure contenant l'identifiant d'un noeud et son contenu.
 */
typedef struct node
{
	int type;				/*!< Entier indiquant le type du noeud. */
	contentNode content;	/*!< Union pointant vers le contenu du noeud. */
} node;

void assemble(tree parent, tree descendant);
tree createNode(int type, char * content, float argc, ...);
void interpretNode(tree T,FILE *yyout);
